import dayjs from 'dayjs'
import 'dayjs/locale/zh-cn'
import relativeTime from 'dayjs/plugin/relativeTime'
import isToday from 'dayjs/plugin/isToday'
import isTomorrow from 'dayjs/plugin/isTomorrow'
import isYesterday from 'dayjs/plugin/isYesterday'
import duration from 'dayjs/plugin/duration'

/**
 * 日期工具类
 * 基于dayjs封装的日期处理工具函数集合
 */

dayjs.locale('zh-cn')
dayjs.extend(relativeTime)
dayjs.extend(isToday)
dayjs.extend(isTomorrow)
dayjs.extend(isYesterday)
dayjs.extend(duration)

/**
 * 格式化日期
 * @param {string|Date} date - 日期对象或字符串
 * @param {string} format - 格式化模板，默认为 'YYYY-MM-DD'
 * @returns {string} 格式化后的日期字符串
 */
export const formatDate = (date, format = 'YYYY-MM-DD') => {
  return dayjs(date).format(format)
}

/**
 * 格式化时间
 * @param {string} time - 时间字符串（如：'14:30:00'）
 * @param {string} format - 格式化模板，默认为 'HH:mm'
 * @returns {string} 格式化后的时间字符串
 */
export const formatTime = (time, format = 'HH:mm') => {
  return dayjs(time, 'HH:mm:ss').format(format)
}

/**
 * 格式化日期时间
 * @param {string|Date} datetime - 日期时间对象或字符串
 * @param {string} format - 格式化模板，默认为 'YYYY-MM-DD HH:mm'
 * @returns {string} 格式化后的日期时间字符串
 */
export const formatDateTime = (datetime, format = 'YYYY-MM-DD HH:mm') => {
  return dayjs(datetime).format(format)
}

/**
 * 获取相对时间描述
 * @param {string|Date} date - 日期对象或字符串
 * @returns {string} 相对时间描述（如：'2小时前'、'明天'）
 */
export const getRelativeTime = (date) => {
  return dayjs(date).fromNow()
}

/**
 * 获取昨天的日期字符串
 * @returns {string} 昨天的日期，格式：YYYY-MM-DD
 */
export const getYesterday = () => {
  return dayjs().subtract(1, 'day').format('YYYY-MM-DD')
}

/**
 * 获取今天的日期字符串
 * @returns {string} 今天的日期，格式：YYYY-MM-DD
 */
export const getToday = () => {
  return dayjs().format('YYYY-MM-DD')
}

/**
 * 获取明天的日期字符串
 * @returns {string} 明天的日期，格式：YYYY-MM-DD
 */
export const getTomorrow = () => {
  return dayjs().add(1, 'day').format('YYYY-MM-DD')
}

/**
 * 获取后天的日期字符串
 * @returns {string} 后天的日期，格式：YYYY-MM-DD
 */
export const getDayAfterTomorrow = () => {
  return dayjs().add(2, 'day').format('YYYY-MM-DD')
}

/**
 * 获取下一个整点时间
 * @returns {string} 下一个整点时间，格式：HH:mm
 */
export const getNextHour = () => {
  const now = dayjs()
  const nextHour = now.add(1, 'hour').startOf('hour')
  return nextHour.format('HH:mm')
}

/**
 * 生成时间选项列表
 * 按15分钟间隔生成一天24小时的时间选项
 * @returns {Array} 时间选项数组，每个元素包含value和label
 */
export const generateTimeOptions = () => {
  const options = []
  // 遍历24小时
  for (let hour = 0; hour < 24; hour++) {
    // 每小时按15分钟间隔生成时间点
    for (let minute = 0; minute < 60; minute += 15) {
      const time = dayjs().hour(hour).minute(minute).second(0)
      options.push({
        value: time.format('HH:mm'),
        label: time.format('HH:mm')
      })
    }
  }
  return options
}

/**
 * 判断指定日期是否为昨天
 * @param {string|Date} date - 日期对象或字符串
 * @returns {boolean} 是否为昨天
 */
export const checkIsYesterday = (date) => {
  return dayjs(date).isYesterday()
}

/**
 * 判断指定日期是否为今天
 * @param {string|Date} date - 日期对象或字符串
 * @returns {boolean} 是否为今天
 */
export const checkIsToday = (date) => {
  return dayjs(date).isToday()
}

/**
 * 判断指定日期是否为明天
 * @param {string|Date} date - 日期对象或字符串
 * @returns {boolean} 是否为明天
 */
export const checkIsTomorrow = (date) => {
  return dayjs(date).isTomorrow()
}

/**
 * 判断任务是否已过期
 * @param {string} date - 截止日期
 * @param {string|null} time - 截止时间，可选
 * @returns {boolean} 是否已过期
 */
export const isOverdue = (date, time = null) => {
  // 如果有具体时间，则精确到分钟；否则截止到当天结束
  const targetDate = time ? 
    dayjs(`${date} ${time}`) : 
    dayjs(date).endOf('day')
  return targetDate.isBefore(dayjs())
}

/**
 * 获取日期的显示文本
 * 将日期转换为友好的显示文本（今天、明天、昨天等）
 * @param {string|Date} date - 日期对象或字符串
 * @returns {string} 日期显示文本
 */
export const getDateDisplayText = (date) => {
  const target = dayjs(date)
  
  if (target.isToday()) {
    return '今天'
  } else if (target.isTomorrow()) {
    return '明天'
  } else if (target.isYesterday()) {
    return '昨天'
  } else if (target.isSame(dayjs().add(2, 'day'), 'day')) {
    return '后天'
  } else {
    return target.format('MM月DD日')
  }
}

/**
 * 获取任务倒计时显示文本
 * @param {string} date - 截止日期
 * @param {string|null} time - 截止时间，可选
 * @returns {string} 倒计时文本（如：'2天3小时'、'30分钟'、'已过期'）
 */
export const getCountdown = (date, time = null) => {
  // 计算目标时间点
  const targetDate = time ? 
    dayjs(`${date} ${time}`) : 
    dayjs(date).endOf('day')
  
  const now = dayjs()
  
  // 检查是否已过期
  if (targetDate.isBefore(now)) {
    return '已过期'
  }
  
  // 计算时间差
  const diff = targetDate.diff(now)
  const durationObj = dayjs.duration(diff)
  
  const days = Math.floor(durationObj.asDays())
  const hours = durationObj.hours()
  const minutes = durationObj.minutes()
  
  // 根据剩余时间返回合适的显示格式
  if (days > 0) {
    return `${days}天${hours}小时`
  } else if (hours > 0) {
    return `${hours}小时${minutes}分钟`
  } else {
    return `${minutes}分钟`
  }
} 